home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 11 / Amiga Plus 11: Amiga Future.iso / rexx / dignetmidimonitor.rexx < prev    next >
OS/2 REXX Batch file  |  1997-06-03  |  5KB  |  216 lines

  1. /***************************************************************************\
  2. **
  3. **    DIGNET AREXX MIDI MONITOR 1.0
  4. **
  5. **
  6. **    Copyright © 1997 by Digital Surface/Kenneth "Kenny" Nilsen
  7. **    Public domain.
  8. **
  9. **---------------------------------------------------------------------------
  10. **
  11. **    This little script will monitor the MIDI port. You should give the
  12. **     correct device name and unit number below to fit your system.
  13. **
  14. **    NOTE: The midi monitoring isn't accurate in this demo script. The
  15. **    routines must have been written differently to achive that. The
  16. **    intention with this script is just to show the possibilities with the
  17. **    dignet.library. However, the RAW logfile in RAM: should be accurate
  18. **    since it uses the Capture function which gets all bytes from the port
  19. **    saved directly to the file.
  20. **
  21. \***************************************************************************/
  22.  
  23. /* Change these settings to fit your system: */
  24.  
  25. DeviceName = "serial.device"
  26. Unit       = "0"
  27.  
  28. /*-------------------------------------------------------------------------*/
  29.  
  30. LF = '0a'x
  31.  
  32. Options RESULTS            /* important or else we wount get net number
  33.                 */
  34. signal on Break_C
  35.  
  36. SAY '0c'x
  37. SAY "MIDI MONITOR VERSION 1.0 - by Digital Surface/Kenneth 'Kenny' Nilsen"
  38. SAY "--------------------------------------------------------------------"
  39. SAY "This arexx script is public domain. Created 1997."
  40. SAY "Require 'dignet.library' version 4 or better due to the built in"
  41. SAY "arexx host in the library."LF
  42.  
  43. IF ~show('p', 'DIGNET') then do
  44.     address command
  45.         "c:loadlib dignet.library"
  46.         "WaitForPort DIGNET"
  47.         END
  48.  
  49.  
  50. Address "DIGNET"           /* arexx port of library
  51. --------------------------------*/
  52.  
  53. AllocNet '"'devicename'"' '"'unit'"'
  54.  
  55. IF (rc~=0) then do
  56.     say "ERROR: Couldn't allocate this net! Check device name and unit.."
  57.     exit 0
  58.     END
  59.  
  60. Net=RESULT
  61.  
  62. SAY "- PRESS CTRL + C TO STOP MONITORING..."
  63. SAY "- Starting RAW MIDI capturing to file 'ram:MIDI.raw'"
  64.  
  65. /* You should be able to send the raw file directly to a midi instrument */
  66.  
  67. CaptureTextStart '"'Net'"' 0 "ram:MIDI.raw"
  68. IF (rc~=0) then SAY "Couldn't capture to file!"
  69.  
  70. SetDefault '"'Net'"'
  71. IF (rc~=0) then say "Couldn't set default parameters to net!"
  72.  
  73. SetBaud '"'Net'"' 31250        /* MIDI baud speed !
  74.                 */
  75. FlushNet '"'net'"'
  76. IF (rc~=0) then say "Couldn't flush the net!"
  77.  
  78. SAY "--------------------------------------------------------------------"
  79.  
  80. /* Here is the main loop that monitors the MIDI port */
  81.  
  82. skip=0
  83.  
  84. do forever
  85.  
  86.     Timeout '"'Net'"' 2
  87.     bytes=result
  88.  
  89.     ReadNet '"'Net'"' '"'bytes'"'
  90.     if (rc~=0) then do
  91.         say "Error reading from MIDI port!"
  92.         say "Quitting..."
  93.         FreeNet '"'net'"'
  94.         exit 0
  95.         END
  96.  
  97. if bytes=0 then skip=3
  98.  
  99. buffer=result||'00'x||'00'x
  100. len=length(buffer)
  101. pos=1
  102.  
  103. do until len=pos-2
  104.  
  105.     byte=substr(buffer,pos,1)
  106.  
  107.     /* check which type of byte this is */
  108.  
  109.     stat=c2d(byte)
  110.  
  111.     if stat="247" then do
  112.         skip=0
  113.         say "SYSTEM EXCLUSIVE END"
  114.         end
  115.  
  116.     if stat="240" then skip=2
  117.  
  118.     if skip=2 then do
  119.         skip=1
  120.         id=c2d(substr(buffer,pos+1,1))
  121.         say "SYSTEM EXCLUSIVE START (ID="ID")"
  122.         end
  123.  
  124. if skip=0 then do
  125.  
  126.     if stat="242" then do
  127.         call bitclr(byte,7)
  128.         say "SYSTEM COMMON MSG: SONG POSITION POINTER ("c2d(substr(buffer,pos+1,1))") ("c2d(substr(buffer,pos+2,1))")"
  129.         end
  130.  
  131.     if stat="243" then do
  132.         call bitclr(byte,7)
  133.         say "SYSTEM COMMON MSG: SONG SELECT ("c2d(substr(buffer,pos+1,1))")"
  134.         end
  135.  
  136.     if stat="246" then do
  137.         call bitclr(byte,7)
  138.         say "SYSTEM COMMON MSG: TUNE REQUEST"
  139.         end
  140.  
  141.     if stat="248" then do
  142.         call bitclr(byte,7)
  143.         say "SYSTEM REAL TIME MSG: MIDI CLOCK"
  144.         end
  145.  
  146.     if stat="250" then do
  147.         call bitclr(byte,7)
  148.         say "SYSTEM REAL TIME MSG: START"
  149.         end
  150.  
  151.     if stat="251" then do
  152.         call bitclr(byte,7)
  153.         say "SYSTEM REAL TIME MSG: CONTINUE"
  154.         end
  155.  
  156.     if stat="252" then do
  157.         call bitclr(byte,7)
  158.         say "SYSTEM REAL TIME MSG: STOP"
  159.         end
  160.  
  161. /*    if stat="254" then do
  162.         call bitclr(byte,7)
  163.         say "SYSTEM REAL TIME MSG: ACTIVE SENSING"
  164.         END
  165. */
  166.  
  167.     if stat="255" then do
  168.         call bitclr(byte,7)
  169.         say "SYSTEM REAL TIME MSG: SYSTEM RESET"
  170.         end
  171.  
  172.     if bittst(byte,7)=1 then do
  173.         msg=c2d(bitand(byte,'F0'x))
  174.         chan=c2d(bitand(byte,'0F'x))+"1"
  175.  
  176.         note=""
  177.         byte=substr(buffer,pos+1,1)
  178.         if bittst(byte,7)=0 then note=c2d(byte)
  179.  
  180.         data=""
  181.         byte=substr(buffer,pos+2,1)
  182.         if bittst(byte,7)=0 then data=c2d(byte)
  183.  
  184.         if msg="128" then say "CHANNEL MODE: NOTE OFF          MIDICH: "chan"  NOTE: "note"  DATA: "data
  185.         if msg="144" then say "CHANNEL MODE: NOTE ON           MIDICH: "chan"  NOTE: "note"  VELOCITY: "data
  186.         if msg="160" then say "CHANNEL MODE: POLY KEY PRESSURE MIDICH: "chan"  NOTE: "note"  DATA: "data
  187.         if msg="176" then say "CHANNEL MODE: CONTROL CHANGE    MIDICH: "chan"  DATA: "note"  DATA: "data
  188.         if msg="192" then say "CHANNEL MODE: PROGRAM CHANGE    MIDICH: "chan"  DATA: "note"  DATA: "data
  189.         if msg="208" then say "CHANNEL MODE: CHANNEL PRESSURE  MIDICH: "chan"  NOTE: "note"  DATA: "data
  190.         if msg="224" then say "CHANNEL MODE: PITCHBEND CHANGE  MIDICH: "chan"  NOTE: "note"  DATA: "data
  191.  
  192.         end
  193.     end
  194.  
  195.     if skip=3 then skip=0
  196.  
  197.     pos=pos+1
  198.     end
  199. end
  200.  
  201.  
  202. Break_C:
  203.  
  204. SAY "--------------------------------------------------------------------"
  205. SAY "MIDI Monitor ended!"
  206.  
  207. FlushNet '"'Net'"'
  208. FreeNet '"'Net'"'           /* Enclose the net variable like this or else
  209.                    arexx will give the keyword 'net' instead
  210.                    of its contents (the netnumber)
  211.                 */
  212.  
  213. IF (rc=5) then SAY "Error: Net' Net 'was not allocated!"
  214.  
  215. exit 0
  216.